<?php
/**
 * 地图工具类
 * @author	Evan<tangzwgo@163.com>
 * @since	2016-03-31
 */
class Map {
    /**
     * 求两个已知经纬度之间的距离,单位为米
     * @param lng1,lng2 经度
     * @param lat1,lat2 纬度
     * @return float 距离，单位米
     */
    public static function calculateTwoPointDistance($lng1, $lat1, $lng2, $lat2) {
        //将角度转为狐度
        $radLat1 = deg2rad($lat1); //deg2rad()函数将角度转换为弧度
        $radLat2 = deg2rad($lat2);
        $radLng1 = deg2rad($lng1);
        $radLng2 = deg2rad($lng2);
        $a = $radLat1 - $radLat2;
        $b = $radLng1 - $radLng2;
        $s = 2 * asin(sqrt(pow(sin($a / 2), 2) + cos($radLat1) * cos($radLat2) * pow(sin($b / 2), 2))) * 6378.137 * 1000;
        return $s;
    }
    
    /**
     * 将其他坐标转成百度坐标
     * @param double $lat 纬度
     * @param double $lng 经度
     */
    public static function toBaiduPoint($lat, $lng) {
    	$ak = "";
        $url = "http://api.map.baidu.com/geoconv/v1/?coords={$lng},{$lat}&ak={$ak}&output=json";
        $result_json = Http::get($url);
        $result_array = json_decode($result_json, true);
        if(isset($result_array['status']) && $result_array['status'] == 0) {
            return $result_array['result'][0];
        } else {
            return array('x'=>$lng,'y'=>$lat);
        }
    }
    
    /**
     * 将地址转换成百度经纬度
     * @param type $address
     */
    public static function addressToBaiduPoint($address) {
    	$ak = "";
        $address = urlencode($address);
        $url = "http://api.map.baidu.com/geocoder/v2/?address={$address}&output=json&ak={$ak}";
        $result_json = Http::get($url);
        $result_array = json_decode($result_json, true);
        if($result_array && isset($result_array['status']) && $result_array['status'] == 0) {
            $lng = $result_array['result']['location']['lng'];//经度
            $lat = $result_array['result']['location']['lat'];//纬度
            return array('x'=>$lng,'y'=>$lat);
        } else {
            return array('x'=>0,'y'=>0);
        }
    }
    
    /**
     * 将百度坐标转换成地址
     * @param type $lat
     * @param type $lng
     */
    public static function baiduPointToAddress($lat, $lng) {
    	$ak = "";
        $url = "http://api.map.baidu.com/geocoder/v2/?output=json&ak={$ak}&location={$lat},{$lng}";
        $result_json = Http::get($url);
        $result_array = json_decode($result_json, true);
        if(isset($result_array['status']) && $result_array['status'] == 0) {
            return $result_array['result'];
        } else {
            return false;
        }
    }
    
    /**
     * 中国正常GCJ02坐标---->百度地图BD09坐标
     * 腾讯地图用的也是GCJ02坐标
     * @param double $lat 纬度
     * @param double $lng 经度
     */
    public static function Convert_GCJ02_To_BD09($lat, $lng) {
        $x_pi = 3.14159265358979324 * 3000.0 / 180.0;
        $x = $lng;
        $y = $lat;
        $z = sqrt($x * $x + $y * $y) + 0.00002 * sin($y * $x_pi);
        $theta = atan2($y, $x) + 0.000003 * cos($x * $x_pi);
        $lng = $z * cos($theta) + 0.0065;
        $lat = $z * sin($theta) + 0.006;
        return array('lng' => $lng, 'lat' => $lat);
    }

    /**
     * 百度地图BD09坐标---->中国正常GCJ02坐标
     * 腾讯地图用的也是GCJ02坐标
     * @param double $lat 纬度
     * @param double $lng 经度
     * @return array();
     */
    public static function Convert_BD09_To_GCJ02($lat, $lng) {
        $x_pi = 3.14159265358979324 * 3000.0 / 180.0;
        $x = $lng - 0.0065;
        $y = $lat - 0.006;
        $z = sqrt($x * $x + $y * $y) - 0.00002 * sin($y * $x_pi);
        $theta = atan2($y, $x) - 0.000003 * cos($x * $x_pi);
        $lng = $z * cos($theta);
        $lat = $z * sin($theta);
        return array('lng' => $lng, 'lat' => $lat);
    }

}